package org.wikinews.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Transactional;
import org.wikinews.model.Post;
import org.wikinews.model.Tag;
import org.wikinews.model.Usuario;
import org.wikinews.repo.PostRepo;
import org.wikinews.repo.TagRepo;
import org.wikinews.repo.UsuarioRepo;

@Name("listarCtrl")
@Scope(ScopeType.PAGE)
public class ListarCtrl implements Serializable {
	
	private static final long serialVersionUID = 6612582663398485318L;
	
	@In
	private Usuario usuario;

	@In
	private PostRepo postRepo;

	@In
	private UsuarioRepo usuarioRepo;
	
	@In
	private TagRepo tagRepo;
		
	private List<Post> postsNaoLidos;

	private List<Post> todos;

	private List<Post> meusPostsFavoritos;
	
	private List<Post> meusPostsPublicados;
	
	private List<Usuario> meusAutoresFavoritos;
	
	private List<Usuario> meusSeguidores;
	
	private List<Tag> minhasTags;
	
	private List<Tag> todasTags;
	
	private List<SelectItem> valoresNotasSI;
	
	private List<Usuario> autoresInteressesComum;
	
	public List<Post> getPostsNaoLidos() {
		if (postsNaoLidos == null) {
			postsNaoLidos = postRepo.getNaoLidos(usuario);
		}
		return postsNaoLidos;
	}

	public List<Post> getMeusPostsFavoritos() {
		if (meusPostsFavoritos == null) {
			meusPostsFavoritos = postRepo.getFavoritos(usuario.getId());
		}
		return meusPostsFavoritos;
	}
	
	public List<Post> getMeusPostsPublicados() {
		if (meusPostsPublicados == null) {
			meusPostsPublicados = postRepo.getAllByAutor(usuario.getId());
		}
		return meusPostsPublicados;
	}
	
	public List<Usuario> getMeusAutoresFavoritos() {
		if (meusAutoresFavoritos == null) {
			meusAutoresFavoritos = usuarioRepo.getFavoritos(usuario.getId());
		}
		return meusAutoresFavoritos;
	}

	public List<Usuario> getMeusSeguidores() {
		if (meusSeguidores == null) {
			meusSeguidores = usuarioRepo.getSeguidores(usuario.getId());
		}
		return meusSeguidores;
	}

	public List<Post> getTodos() {
		if (todos == null) {
			todos = postRepo.getTodos(usuario);
		}
		return todos;
	}
	
	public List<Tag> getMinhasTags() {
		if (minhasTags == null) {
			minhasTags = usuarioRepo.getTags(usuario.getId());
		}
		return minhasTags;
	}
	
	public List<Usuario> getAutoresInteressesComum() {
		if (autoresInteressesComum == null) {
			autoresInteressesComum = usuarioRepo.getAutoresComTagsEmComum(usuario.getId());
		}
		return autoresInteressesComum;
	}
	
	public List<Tag> getTodasTags() {
		if (todasTags == null) {
			todasTags = tagRepo.getAll();
		}
		return todasTags;
	}

	public List<SelectItem> getValoresNotasSI() {
		if (valoresNotasSI == null) {
			valoresNotasSI = postRepo.getListValoresNotasSI();
		}
		return valoresNotasSI;
	}
	
	@Transactional
	public List<Tag> autocompleteTagSuggestionBox(Object event) {
		List<Tag> listTagsSugeridas = new ArrayList<Tag>();
		if (event != null && event != "") {
			String prefixo = event.toString().toLowerCase();       
			for (Tag tag : getTodasTags()) {
				if (tag.getId().toLowerCase().startsWith(prefixo)) {
					listTagsSugeridas.add(tag);
				}
			}
		}
		return listTagsSugeridas;
	}
}
